#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

// void fun()
// {
//     printf("fun begin\n");
//     _exit(4);
//     printf("fun end\n");
// }

int main()
{
    pid_t pid = fork();
    if (pid < 0)
    {
        perror("fork");
        exit(1);
    }
    else if (pid == 0)
    {
        //child
        int cnt = 3;
        while (1)
        {
            printf("pid: %d, ppid :%d\n", getpid(),getppid());
            sleep(1);
        }
        exit(1);
    }
    //father
    while(1)
    {
        int status;
        pid_t wpid = waitpid(pid, &status, WNOHANG);
        if(wpid > 0)
        {
            printf("wait success, chid pid: %d, status: %d, exit singal: %d\n", wpid, WEXITSTATUS(status), WTERMSIG(status));
            break;
        }
        else if(wpid == 0)
        {
            printf("子进程还未退出,继续等待\n");
            sleep(3);
        }
        else
        {
            printf("wait failed\n, errno: %d\n,strerror: %s\n", errno,strerror(errno));
            exit(errno);
        }
    }
    // int status = 0;
    // pid_t wpid = waitpid(pid, &status, 0);
    // if(wpid > 0)
    // {
    //     //printf("wait success, chid pid: %d, status: %d, exit singal: %d\n", wpid, (status>>8)&0xff, status& 0x7f);
    //     printf("wait success, chid pid: %d, status: %d, exit singal: %d\n", wpid, WEXITSTATUS(status), WTERMSIG(status));
    // }
    // else
    // {
    //     printf("wait failed\n, errno: %d\n,strerror: %s\n", errno,strerror(errno));
    //     exit(errno);
    // }

    
    // printf("main");
    // sleep(1);
    // exit(4);
    // fun();
    // printf("maiN\n");
    // int a = 10;
    // a/=0;
    // for(int i = 0; i < 200; i++)
    // {
    //     printf("%d: %s\n",i,strerror(i));
    // }
    // FILE *fp = fopen("test.txt", "r");
    // if (fp == NULL)
    //     return errno;
    // fclose(fp);
    return 0;
}   